package Filters;


import java.util.ArrayList;
import java.util.Iterator;


import FilesManagers.CantOpenFileException;
import FilesManagers.FileManager;
import FilesManagers.NoMoreLinesException;


public abstract class WordsFilter extends Filter{

	private String biblioteca;
	private char marcadorComentario;
	private char separadorPalabras;
	private ArrayList<String> listaPalabras;



	public WordsFilter (String biblioteca) throws CantOpenFileException{
		this(biblioteca,'#',',');

	}

	public WordsFilter (String biblioteca,char marcadorComentario,char separadorPalabras) throws CantOpenFileException{
		 this.biblioteca = biblioteca;
		 this.marcadorComentario = marcadorComentario;
		 this.setSeparadorPalabras(separadorPalabras);
		 listaPalabras = new ArrayList<String>();
		 this.loadWords();
	}



	private void loadWords() throws CantOpenFileException{
		String linea;
		String[] lista;
		FileManager manejadorArchivo = new FileManager();
		try{
			manejadorArchivo.cargarArchivo(this.biblioteca);
			manejadorArchivo.setMarcadorComentario(this.marcadorComentario);
	
			try{
				while((linea= manejadorArchivo.obtenerSiguienteLinea())!=null){
	
						lista = linea.split(Character.toString(this.getSeparadorPalabras()));
						for(int pos=0; pos < lista.length ; pos++){
							this.listaPalabras.add(lista[pos]);
	
						}
				}
			}catch(NoMoreLinesException e){
				System.out.println("TOTAL DE STOPWORDS= "+this.listaPalabras.size());
			}
		}catch(CantOpenFileException e){
			throw e;
		}
		


	}
	
	protected abstract String reemplazoPatron(String linea,String palabra);

	private String filterWords(String lineaOrigen){

		lineaOrigen = " "+lineaOrigen+" ";
		Iterator<String> palabrasIt = this.listaPalabras.iterator();
		while(palabrasIt.hasNext()){

			String palabra = palabrasIt.next();
			//do{
				lineaOrigen = reemplazoPatron(lineaOrigen,palabra);
			//}while(Pattern.matches(".* "+palabra+" .*",lineaOrigen));

		}
		return lineaOrigen.trim();

	}


	public String procesarLinea(String linea){
		linea=filterWords(linea);
		return linea;


	}

	protected void setSeparadorPalabras(char separadorPalabras) {
		this.separadorPalabras = separadorPalabras;
	}

	protected char getSeparadorPalabras() {
		return separadorPalabras;
	}



}